import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import * as path from 'path';
import { resolve } from 'path';
import Components from 'unplugin-vue-components/vite';
import AutoImport from 'unplugin-auto-import/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';

export default defineConfig({
  resolve: {
    //设置别名
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  },

  plugins: [
    vue(),
    // 自动导入组件
    Components({
      resolvers: [ElementPlusResolver()],
      // 指定组件类型定义文件的生成位置
      dts: true,
      // 包括的文件
      include: [/\.vue$/, /\.vue\?vue/, /\.tsx$/]
    }),
    // 自动导入 API
    AutoImport({
      imports: [
        'vue',
        'vue-router',
        'pinia',
        {
          'element-plus': [
            'ElMessage',
            'ElMessageBox',
            'ElNotification',
            'ElLoading'
          ]
        }
      ],
      resolvers: [ElementPlusResolver()],
      dts: './auto-imports.d.ts',
      eslintrc: {
        enabled: true // 生成 eslint 配置
      }
    })
  ],
  base: './',
  // 打包配置
  build: {
    // 输出目录
    outDir: 'dist',
    // 生成静态资源的存放目录
    assetsDir: 'assets',
    // 确保生成 manifest 文件
    manifest: true,
    // 小于此阈值的导入或引用资源将内联为 base64 编码
    assetsInlineLimit: 4096,
    // 启用/禁用 CSS 代码拆分
    cssCodeSplit: true,
    // 构建后是否生成 source map 文件
    sourcemap: false,

    // 自定义底层的 Rollup 打包配置
    rollupOptions: {
      input: {
        main: resolve(__dirname, 'index.html')
      },
      output: {
        // 分块策略
        chunkFileNames: 'assets/js/[name]-[hash].js',
        entryFileNames: 'assets/js/[name]-[hash].js',
        assetFileNames: (assetInfo: any) => {
          const info = assetInfo.name.split('.');
          const ext = info[info.length - 1];
          if (
            ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'ico', 'bmp'].includes(
              ext
            )
          ) {
            return 'assets/images/[name]-[hash][extname]';
          }
          if (['woff', 'woff2', 'eot', 'ttf', 'otf'].includes(ext)) {
            return 'assets/fonts/[name]-[hash][extname]';
          }
          if (['css', 'less', 'scss', 'sass'].includes(ext)) {
            return 'assets/css/[name]-[hash][extname]';
          }
          return 'assets/[name]-[hash].[extname]';
        },
        // 手动分块
        manualChunks: {
          vue: ['vue', 'vue-router', 'pinia'],
          vendor: ['axios', 'lodash-es']
        }
      }
    },

    // chunk 大小警告的限制
    chunkSizeWarningLimit: 5000
  },

  server: {
    port: 8088, //启动端口
    open: true, // 自动打开浏览器
    cors: true, // 允许跨域

    // 设置 https 代理
    proxy: {
      '/api': {
        // target: 'http://47.108.112.28',
        target: 'http://192.168.10.16:9501',
        changeOrigin: true,
        // rewrite: (path: string) => path.replace(/^\/api/, '/api'),
        // 重写路径（根据实际情况调整）
        // rewrite: (path) => {
        //   const newPath = path.replace(/^\/api/, '')
        //   console.log(`🔄 路径重写: ${path} -> ${newPath}`)
        //   // return newPath
        // },
        // 配置代理超时设置
        configure: (proxy, options) => {
          proxy.on('proxyReq', (proxyReq, req, res) => {
            console.log('代理请求:', req.method, req.url);
          });
          proxy.on('proxyRes', (proxyRes, req, res) => {
            console.log('代理响应:', proxyRes.statusCode, req.url);
          });
          proxy.on('error', (err, req, res) => {
            console.error('代理错误:', err.message);
          });
        },
        // 超时配置
        timeout: 60000, // 60秒超时
        proxyTimeout: 60000 // 代理超时时间
      },
      '/admin': {
        target: 'http://47.108.112.28',
        // target: 'http://192.168.5.154:9501',
        changeOrigin: true
      }
    }
  }
});
